home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / nmap.nasl < prev    next >
Text File  |  2005-03-31  |  16KB  |  486 lines

  1. #TRUSTED 49b1dd0eb13d33ba505f06419ec14e40b559d0202f8a66c6c68a68b1626f1bff0283bec7b9d1ce7cbaa3608821c548c0dfbd973b7f9fdeaaf70c64a0febc3052cdaca19b333d45ad35f6b8c0b9a566eaa9f1d563f93618af1706fc424bedf4d3948b1e5ebdaebff05d35791a35580813de008c0d72574c519d96bb578ef6c6a06631987396c9d2fbb6bc5839f7b5f431fed2c10d6e02d184f054d66defe587d4b4641e5e2517d36717a64d2d21ba560adcb1e9f0da12f72fcafa6096ab37af72482b10b3eb37643f5f1f794a48a8ffb6f441322b959b955bbb937afea4a42929f37456b56eeef1bb21f95d938ac49745fc227d62322f6c4be443153bb68a4235dda6bf276665a71ca8804c0b553add2871f1750e33f6dcd2106c363929888142099adf7d483240c93ebce820ac29f442c7d44b8bde88cb39ed8ed009247c889dbf1ea8fb660110e856f4dbbde9861a61778f8a1033c0d9dcfec43f963a3e1acfc5a6305dca695df8a4ee85ebdcf2a76819a30342973ce80f8b131b42e794ec47ea62db3f6a326fb65f64cd111ef2fa551eebd3e72aebb0bff3ecd48eccfa8ee202f60d14082a1af51b35b8b5921e59bd04ca8ac76de8b4d13bb1ae567836295851bb16e8e92f91202e5bf747286c467ebcdb70a942a6ea0be6baa12b3f16e32297d945684a9084e717af874224ddd44723bde731457cb9c9676b45c68cae6975
  2. #
  3. # This script was written by Michel Arboi <arboi@alussinan.org>
  4. #
  5. # GPL
  6. #
  7. if ( ! defined_func("pread") || ! defined_func("get_preference") ) exit(0);
  8. if ( ! find_in_path("nmap") ) exit(0);
  9.  
  10.  
  11. if(description)
  12. {
  13.  script_id(14259);
  14.  script_version ("1.16");
  15.  name["english"] = "Nmap (NASL wrapper)";
  16.  script_name(english:name["english"]);
  17.  
  18.  desc["english"] = "
  19. This plugin runs nmap(1) to find open ports.
  20. See the section 'plugins options' to configure it
  21.  
  22. ";
  23.  
  24.  script_description(english:desc["english"]);
  25.  
  26.  summary["english"] = "Performs portscan / RPC scan";
  27.  script_summary(english:summary["english"]);
  28.  
  29.  script_category(ACT_SCANNER);
  30.  
  31.  script_copyright(english:"This script is Copyright (C) 2004 Michel Arboi");
  32.  family["english"] = "Port scanners";
  33.  family["francais"] = "Scanners de ports";
  34.  script_family(english:family["english"], francais:family["francais"]);
  35.  
  36.  script_dependencies("ping_host.nasl");
  37.  
  38.  if (NASL_LEVEL < 2181) exit(0);    # Cannot run
  39.  
  40.  v = pread(cmd: "nmap", argv: make_list("nmap", "-V"));
  41.  if (v != NULL)
  42.  {
  43.   ver = ereg_replace(pattern: ".*nmap version ([0-9.]+).*", string: v, replace: "\1");
  44.   if (ver == v) ver = NULL;
  45.   }
  46.  
  47.  if (ver =~ "^[3-9]\.")
  48.  script_add_preference(name:"TCP scanning technique :", type:"radio", 
  49.   value:"connect();SYN scan;FIN scan;Xmas Tree scan;SYN FIN scan;FIN SYN scan;Null scan");
  50.  else
  51.  script_add_preference(name:"TCP scanning technique :", type:"radio", 
  52.   value:"connect();SYN scan;FIN scan;Xmas Tree scan;Null scan");
  53.  
  54.  script_add_preference(name:"UDP port scan", type:"checkbox", value: "no");
  55.  # This option eats too much memory and hits rlimits
  56.  if (NASL_LEVEL > 2200)
  57.   script_add_preference(name:"Service scan", type:"checkbox", value: "no");
  58.  script_add_preference(name:"RPC port scan", type:"checkbox", value: "no");
  59.  # Too much memory
  60.  if (NASL_LEVEL > 2200)
  61.  {
  62.   script_add_preference(name:"Identify the remote OS", type:"checkbox", value: "no");
  63.   script_add_preference(name:"Use hidden option to identify the remote OS", type:"checkbox", value: "no");
  64.  }
  65.  script_add_preference(name:"Fragment IP packets (bypasses firewalls)", type:"checkbox", value: "no");
  66.  if (ver !~ "3.7[05]")
  67.  script_add_preference(name:"Get Identd info", type:"checkbox", value: "no");
  68.  script_add_preference(name:"Do not randomize the  order  in  which ports are scanned", type:"checkbox", value: "no");
  69.  script_add_preference(name: "Source port :", value: "", type: "entry");
  70.  script_add_preference(name:"Timing policy :", type:"radio",
  71.   value: "Auto (nessus specific!);Normal;Insane;Aggressive;Polite;Sneaky;Paranoid;Custom");
  72.  script_add_preference(name: "Host Timeout (ms) :", value: "", type: "entry");
  73.  script_add_preference(name: "Min RTT Timeout (ms) :", value: "", type: "entry");
  74.  script_add_preference(name: "Max RTT Timeout (ms) :", value: "", type: "entry");
  75.  script_add_preference(name: "Initial RTT timeout (ms) :", value: "", type: "entry");
  76.  script_add_preference(name: "Ports scanned in parallel (max)", value: "", type: "entry");
  77.  script_add_preference(name: "Ports scanned in parallel (min)", value: "", type: "entry");
  78.  script_add_preference(name: "Minimum wait between probes (ms)", value: "", type: "entry");
  79.  script_add_preference(name: "File containing grepable results : ", value: "", type: "file");
  80.  script_add_preference(name: 'Do not scan targets not in the file', value: 'no', type: 'checkbox');
  81.  if (ver =~ "^3\.")
  82.  script_add_preference(name: "Data length : ", value: "", type: "entry");
  83.  
  84.  exit(0);
  85. }
  86.  
  87. #
  88. if (NASL_LEVEL < 2181 || ! defined_func("pread") || ! defined_func("get_preference"))
  89. {
  90.   set_kb_item(name: "/tmp/UnableToRun/14255", value: TRUE);
  91.   display("Script #14255 (nmap_wrapper) cannot run - upgrade libnasl\n");
  92.   exit(0);
  93. }
  94.  
  95. tmpfile = NULL;
  96.  
  97. function on_exit()
  98. {
  99.   if (tmpfile) unlink(tmpfile);
  100. }
  101.  
  102. function compute_rtt()
  103. {
  104.   local_var    p, i, min, max, s, t1, t2, ms, v1, v2;
  105.  
  106.   min = 10000; 
  107.   max = 0;
  108.  
  109.   foreach p (make_list(80, 113))
  110.    for (i = 0; i < 3; i ++)
  111.    {
  112.     t1 = gettimeofday();
  113.     s = open_sock_tcp(p, timeout: 10, transport: ENCAPS_IP);
  114.     t2 = gettimeofday();
  115.     if (s) close(s);
  116.     v1 = eregmatch(string: t1, pattern: "([0-9]+)\.([0-9]+)");
  117.     v2 = eregmatch(string: t2, pattern: "([0-9]+)\.([0-9]+)");
  118.     ms = (int(v2[1]) - int(v1[1])) * 1000 + (int(v2[2]) - int(v1[2])) / 1000;
  119.     if (ms > 9000 && !s) break;
  120.     if (min > ms) min = ms;
  121.     if (max < ms) max = ms;
  122.    }
  123.   if (max < 3 * min) max = 3 * min;
  124.   if (min >= 9000) min = 0;
  125.   if (max && max < 6) max = 6;
  126.   if (max >= 9000) max = 0;
  127.   if (isnull(min) && isnull(max)) return NULL;
  128.   return make_list(min, max);
  129. }
  130.  
  131. safe = safe_checks();
  132.  
  133. ip = get_host_ip();
  134. esc_ip = ""; l = strlen(ip);
  135. for (i = 0; i < l; i ++) 
  136.   if (ip[i] == '.') esc_ip = strcat(esc_ip, "\.");
  137.   else esc_ip = strcat(esc_ip, ip[i]);
  138.  
  139. res = script_get_preference_file_content("File containing grepable results : ");
  140. res = egrep(pattern: "Host: +" + esc_ip + " ", string: res);
  141. if (! res)
  142. {
  143.  opt = script_get_preference('Do not scan targets not in the file');
  144.  if ('yes' >< opt) exit(0);
  145.  
  146.  i = 0;
  147.  argv[i++] = "nmap";
  148.  argv[i++] = "-n";
  149.  argv[i++] = "-P0";    # Nmap ping is not reliable
  150.  argv[i++] = "-oG";
  151.  if (defined_func("get_tmp_dir"))
  152.  {
  153.   tmpdir = get_tmp_dir();
  154.   if (tmpdir) tmpfile = strcat(tmpdir, "nmap-", get_host_ip(), "-", rand() );
  155.  }
  156.  if (tmpfile)
  157.   argv[i++] = tmpfile;
  158.  else
  159.  argv[i++] = "-";
  160.  
  161.  p = script_get_preference("TCP scanning technique :");
  162.  # Force TCP scan in safe mode - other options could crash the IP stack
  163.  # TCP scan is more aggressive against broken services than SYN scan,
  164.  # but those services will probably be killed by fin_service or similar
  165.  # tests.
  166.  if (safe) argv[i++] = "-sT";
  167.  else if (p == "SYN scan" || p == "SYN FIN scan") argv[i++] = "-sS";
  168.  else if (p == "FIN scan" || p == "FIN SYN scan") argv[i++] = "-sF";
  169.  else if (p == "Xmas Tree scan") argv[i++] = "-sX";
  170.  else if (p == "Null scan") argv[i++] = "-sN";
  171.  else argv[i++] = "-sT";
  172.  if (p == "FIN SYN scan" || p == "SYN FIN scan")
  173.  {
  174.    argv[i++] = "--scanflags";
  175.    argv[i++] = "SYNFIN";
  176.  }
  177.  
  178.  # UDP & RPC scans or fingerprinting may kill a buggy IP stack
  179.  if (! safe)
  180.  {
  181.   p = script_get_preference("UDP port scan");
  182.   if ("yes" >< p) argv[i++] = "-sU";
  183.   p = script_get_preference("Service scan");
  184.   if ("yes" >< p) argv[i++] = "-sV";
  185.   p = script_get_preference("RPC port scan");
  186.   if ("yes" >< p) argv[i++] = "-sR";
  187.   p = script_get_preference("Identify the remote OS");
  188.   if ("yes" >< p) argv[i++] = "-O";
  189.   p = script_get_preference("Use hidden option to identify the remote OS");
  190.   if ("yes" >< p) argv[i++] = "--osscan_guess";
  191.   p = script_get_preference("Fragment IP packets (bypasses firewalls)");
  192.   if ("yes" >< p) argv[i++] = "-f";
  193.  }
  194.  p = script_get_preference("Get Identd info");
  195.  if ("yes" >< p) argv[i++] = "-I";
  196.  port_range = get_preference("port_range");
  197.  if (port_range) # Null for command line tests only
  198.  {
  199.   argv[i++] = "-p";
  200.   if (port_range == "default" )
  201.   {
  202.    n = 0;
  203.    str = "";
  204.    while ( port = scanner_get_port(n) )
  205.    {
  206.     if ( n > 0 ) str += "," + string(port);
  207.     else str = string(port);
  208.     n ++;
  209.    }
  210.    argv[i++] = str;
  211.   }
  212.   else
  213.    argv[i++] = port_range;
  214.   }
  215.  
  216.  p = script_get_preference("Do not randomize the  order  in  which ports are scanned");
  217.  if ("yes" >< p) argv[i++] = "-r";
  218.  p = script_get_preference("Source port :");
  219.  if (p =~ '^[0-9]+$') { argv[i++] = "-g"; argv[i++] = p; }
  220.  
  221.  # We should check the values when running in "safe checks".
  222.  custom_policy = 0;
  223.  p = script_get_preference("Host Timeout (ms) :");
  224.  if (p =~ '^[0-9]+$')
  225.  {
  226.    argv[i++] = "--host_timeout";
  227.    argv[i++] = p;
  228.    custom_policy ++;
  229.  }
  230.  p = script_get_preference("Min RTT Timeout (ms) :");
  231.  if (p =~ '^[0-9]+$')
  232.  {
  233.    argv[i++] = "--min_rtt_timeout";
  234.    argv[i++] = p;
  235.    custom_policy ++;
  236.  }
  237.  p = script_get_preference("Max RTT Timeout (ms) :");
  238.  if (p =~ '^[0-9]+$')
  239.  {
  240.    argv[i++] = "--max_rtt_timeout";
  241.    argv[i++] = p;
  242.    custom_policy ++;
  243.  }
  244.  p = script_get_preference("Initial RTT Timeout (ms) :");
  245.  if (p =~ '^[0-9]+$')
  246.  {
  247.    argv[i++] = "--initial_rtt_timeout";
  248.    argv[i++] = p;
  249.    custom_policy ++;
  250.  }
  251.  min = 1;
  252.  p = script_get_preference("Ports scanned in parallel (min)");
  253.  if (p =~ '^[0-9]+$')
  254.  {
  255.    argv[i++] = "--min_parallelism";
  256.    argv[i++] = p;
  257.    min = p;
  258.    custom_policy ++;
  259.  }
  260.  p = script_get_preference("Ports scanned in parallel (max)");
  261.  if (p =~ '^[0-9]+$')
  262.  {
  263.    argv[i++] = "--max_parallelism";
  264.    if (p < min) p = min;
  265.    argv[i++] = p;
  266.    custom_policy ++;
  267.  }
  268.  
  269.  p = script_get_preference("Minimum wait between probes (ms)");
  270.  if (p =~ '^[0-9]+$')
  271.  {
  272.    argv[i++] = "--scan_delay";
  273.    argv[i++] = p;
  274.    custom_policy ++;
  275.  }
  276.  
  277.  if (! custom_policy)
  278.  {
  279.    p = script_get_preference("Timing policy :");
  280.    if ("Auto" >< p)
  281.    {
  282.       rtt = compute_rtt();
  283.       if (! isnull(rtt))
  284.       {
  285.         minrtt = rtt[0];
  286.         maxrtt = rtt[1];
  287.         if (minrtt)
  288.         {
  289.          argv[i++] = "--min_rtt_timeout";
  290.          argv[i++] = minrtt;
  291.         }
  292.         if (maxrtt)
  293.         {
  294.          argv[i++] = "--max_rtt_timeout";
  295.          argv[i++] = maxrtt;
  296.         }
  297.       }
  298.       # otherwise, use "Normal" timing
  299.     }
  300.     else if (p != "Normal")
  301.     {
  302.      argv[i++] = "-T";
  303.      # Disable aggresive timings in safe checks
  304.      if (safe && ("Insane">< p || "Aggressive" >< p)) argv[i++] = "Normal";
  305.      else argv[i++] = p;
  306.     }
  307.  }
  308.  
  309.  p = script_get_preference("Data length : ");
  310.  if (p =~ '^[0-9]+$')
  311.  {
  312.    argv[i++] = "--data_length";
  313.    argv[i++] = p;
  314.    custom_policy ++;
  315.  }
  316.  
  317.  argv[i++] = ip;
  318.  
  319. scanner_status(current: 0, total: 65535);
  320.  
  321.  res = pread(cmd: "nmap", argv: argv, cd: 1);
  322.  if (tmpfile)
  323.   res = fread(tmpfile);
  324. # display(argv, "\n", res, "\n\n");
  325.  if (! res) exit(0);    # error
  326. }
  327.  
  328. if (egrep(string: res, pattern: '^# +Ports scanned: +TCP\\(65535;'))
  329.   full_scan = 1;
  330. else
  331.  full_scan = 0;
  332.  
  333. res = egrep(pattern: "Host: +" + esc_ip + " ", string: res);
  334. if (! res)
  335. {
  336.  set_kb_item(name: "Host/ping_failed", value: "yes");
  337.  exit(0);
  338. }
  339.  
  340. res = ereg_replace(pattern: 'Host: +[0-9.]+ .*[ \t]+Ports: +',
  341.     string: res, replace: "");
  342. # Fields:
  343. # port_nb/state/protocol/owner/port_name/rpc_name/service/
  344. # Example:
  345. # Host: 127.0.0.1 ()      Ports: 111/open/tcp/bin/rpcbind (rpcbind V2)/(rpcbind:100000*2-2)/2 (rpc #100000)/, 111/open/udp//rpcbind (rpcbind V2)/(rpcbind:100000*2-2)/2 (rpc #100000)/, 113/open/tcp/root/ident //Linux-identd/, 119/open/tcp/root/nntp //Leafnode NNTPd 1.9.49.rel/, 123/open/udp//ntp ///, 137/open/udp//netbios-ns //Samba nmbd (host: CASSEROLE workgroup: MAISON)/, 138/open/udp//netbios-dgm ///, 139/open/tcp/root/netbios-ssn //Samba smbd 3.X (workgroup: MAISON)/      Ignored State: closed (194)
  346.  
  347. scanned = 0; udp_scanned = 0; ident_scanned = 0;
  348. while (res)
  349. {
  350.   r = strstr(res, "/, ");
  351.   # display("r=", r, "\n");
  352.   if (! r) r = strstr(res, '/\t');
  353.   l = strlen(res) - strlen(r);
  354.   if (r)
  355.   {
  356.     p = substr(res, 0, l); 
  357.     res = substr(res, l+2);
  358.   }
  359.   else
  360.     break;
  361.   v = eregmatch(string: p, icase: 1, 
  362.   pattern: "^ *([0-9]+)/([^/]+)/([^/]+)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/");
  363.   if (! isnull(v))
  364.   {
  365.    port = v[1];
  366.    status = v[2];
  367.    proto = v[3];
  368.    owner = v[4];
  369.    svc = v[5];
  370.    rpc = v[6];
  371.    ver = v[7];
  372. # display("port=", port, "\nstatus=", status, "\nproto=", proto, "\nsvc=", svc, "\nowner=", owner, "\nrpc=", rpc, "\nver=", ver, "\n\n");
  373.    if ("open" >< status)    # nmap 3.70 says "open|filtered" on UDP
  374.      scanner_add_port(proto: proto, port: port);
  375.     if (owner)
  376.     {
  377.       security_note(port: port, proto: proto, data: "This service is owned by user "+owner);
  378.       set_kb_item(name: "Ident/"+proto+"/"+port, value: owner);
  379.       ident_scanned ++;
  380.     }
  381.     scanned ++;
  382.     if (proto == "udp") udp_scanned ++;
  383.     if (strlen(rpc) > 1)
  384.     {
  385.       r = ereg_replace(string: rpc, pattern: "\(([^:]+):.+\)", replace: "\1");
  386.       if (! r) r = rpc;
  387.       security_note(port: port, proto: proto, 
  388.        data: "The RPC service "+r+" is running on this port
  389. If you do not use it, disable it, as it is
  390. a potential security risk");
  391.     }
  392.     if (ver)
  393.     {
  394.       ver = ereg_replace(pattern: "^([0-9-]+) +\((.+)\)$", string: ver,
  395.     replace: "\2 V\1");
  396.       security_note(port: port, proto: proto, data: "Nmap has identified this service as " + ver);
  397.       set_kb_item(name: 'Nmap/'+proto+'/'+port+'/version', value: ver);
  398.       if (string !~ "\?$")
  399.        set_kb_item(name: 'Nmap/'+proto+'/'+port+'/svc', value: svc);
  400.       # set_kb_item(name: "NmapSvc/"+port, value: svc);
  401.     }
  402.  }
  403. }
  404.  
  405. v = eregmatch(string: res, pattern: 'OS: (.+)[ \t]+[A-Za-z]+:');
  406. if (! isnull(v))
  407. {
  408.   security_note(port: 0, data: "Nmap found that this host is running "+v[1]);
  409.   set_kb_item(name: "Host/OS", value: v[1]);
  410. }
  411.  
  412. v = eregmatch(string: res, pattern: 'Seq Index: ([^\t]+)');
  413. if (! isnull(v))
  414. {
  415.   idx = int(v[1]);
  416.   if (idx == 9999999)
  417.   {
  418.     security_note(port: 0, data: "The TCP initial sequence number of the remote host look truely random. 
  419. Excellent!");
  420.     set_kb_item(name: "Host/tcp_seq", value: "random");
  421.    }
  422.   else if (idx == 0)
  423.   {
  424.     security_hole(port: 0, data: 
  425. "The TCP sequence numbers of the remote host are
  426. constant ! A cracker may use this flaw to spoof TCP connections
  427. easily.
  428.  
  429. Solution : contact your vendor for a patch
  430. Risk factor : High");
  431.     set_kb_item(name: "Host/tcp_seq", value: "constant");
  432.   }
  433.   else if (idx == 1)
  434.   {
  435.     security_hole(port: 0, data: 
  436. "The TCP sequence numbers of the remote host are
  437. always incremented by 64000, so they can be
  438. guessed rather easily. A cracker may use
  439. this flaw to spoof TCP connections easily.
  440.  
  441. Solution : contact your vendor for a patch
  442. Risk factor : High");
  443.     set_kb_item(name: "Host/tcp_seq", value: "64000");
  444.   }
  445.   else if (idx == 10)
  446.   {
  447.     security_hole(port: 0, data: 
  448. "The TCP sequence numbers of the remote host are
  449. always incremented by 800, so they can be
  450. guessed rather easily. A cracker may use
  451. this flaw to spoof TCP connections easily.
  452.  
  453. Solution : contact your vendor for a patch
  454. Risk factor : High");
  455.     set_kb_item(name: "Host/tcp_seq", value: "800");
  456.   }
  457.   else if (idx < 75)
  458.   {
  459.     security_hole(port: 0, data: 
  460. "The TCP sequence numbers of the remote host
  461. depends on the time, so they can be
  462. guessed rather easily. A cracker may use
  463. this flaw to spoof TCP connections easily.
  464.  
  465. Solution : http://www.microsoft.com/technet/security/bulletin/ms99-046.asp
  466. Risk factor : High ");
  467.     set_kb_item(name: "Host/tcp_seq", value: "time");
  468.   }
  469.   else
  470.   {
  471.     security_note(port: 0, data: "The TCP initial sequence number of the remote host are incremented by random positive values. 
  472. Good!");
  473.     set_kb_item(name: "Host/tcp_seq", value: "random");
  474.    }
  475.   set_kb_item(name: "Host/tcp_seq_idx", value: v[1]);
  476. }
  477.  
  478. v = eregmatch(string: res, pattern: 'IPID Seq: ([^\t]+)');
  479. if (! isnull(v))
  480.   security_note(port: 0, data: "the IP ID sequence generation is: " + v[1]);
  481.  
  482. if (scanned) set_kb_item(name: "Host/scanned", value: TRUE);
  483. if (udp_scanned) set_kb_item(name: "Host/udp_scanned", value: TRUE);
  484. if (ident_scanned && full_scan) set_kb_item(name: "Host/ident_scanned", value: TRUE);
  485. scanner_status(current: 65535, total: 65535);
  486.